/**
 * ts 函数 ：可选参数 
 * function 函数名(形参？:类型):返回值类型{}
 * 
 */
function bunGun(name?:string):void {
     console.log(`购买了${name}的机枪`);
};

bunGun() // 可以不传
bunGun('ak47') //也可传


/**
 * ts 函数：默认值
 * 注意：带默认值的参数 本身也是可选参数
 * function 函数名(形参1:类型=默认值1,形参2:类型=默认值2):返回值类型{}
 * 
 * 
 * 调用
 * 1： 不传递实参       函数名()                ---->编译后 函数名(默认值1,默认值2)
 * 2： 传递1实参        函数名(实参1)           ---->编译后 函数名(实参1,默认值2)
 * 3： 传递2个实参      函数名(实参1,实参2)      ---->编译后 函数名(实参1,实参2)
 * 4： 只传递第二个实参  函数名(undefined,实参2) ---->编译后 函数名(默认值1,实参2)
 * 
 */

 function daBaoJian(girlName:string="三上悠亚",count:number=1):void {
     console.log(`老板给我来个${girlName},做${count}次精油推背`);
}
 
daBaoJian();//不传参数
daBaoJian("波多野结衣");//传1个参数
daBaoJian("大桥未久",10);//传2个参数
daBaoJian(undefined,100);//只传第2个参数


 /**
  * ts 函数：剩余参数
  * 
  * function 函数名(形参1:类型,形参2:类型,...形参3:类型[]):返回值类型{
  *    console.log("剩余参数")
  * } 
  * 
  * 特点：
  * 剩余参数：只能 定义一个
  *          只能 定义为数组
  *          只能 定义在形参列表最后
  * 
  */


  //例子 不确定参数求和; 需要利用剩余参数


  function add(x:number,y:number,...restNum:Array<number>):void {
     //1.创建1个求和变量，保存求和结果,将x和y求和的值存入
      let result:number = x + y;

      // 遍历剩余参数 累加在 result 上
      for (const item of restNum) {
          result += item;
      }
      //打印输出结果
      console.log(result);
      
}
  
add(1,3,4,5)


